namespace CSharpPro._1103;

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class UserServiceImpl : UserService
{
    // 泛型集合存储用户（键：用户名，值：User对象）
    private Dictionary<string, User> _userDict = new Dictionary<string, User>();

    // 验证用户名格式（3-15字符，仅字母、数字、下划线）
    private bool IsValidUsername(string username) => Regex.IsMatch(username, @"^[a-zA-Z0-9_]{3,15}$");

    // 验证密码格式（6-20字符，含至少1个大写、1个小写、1个数字）
    private bool IsValidPassword(string password) => Regex.IsMatch(password, @"^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{6,20}$");

    // 验证输入非空（非null、非纯空格）
    private bool IsNotEmpty(string input) => !string.IsNullOrWhiteSpace(input);

    public bool Register(string username, string password)
    {
        if (!IsNotEmpty(username) || !IsValidUsername(username))
        {
            Console.WriteLine("用户名格式错误（3-15位，仅含字母、数字、下划线）！");
            return false;
        }

        if (!IsNotEmpty(password) || !IsValidPassword(password))
        {
            Console.WriteLine("密码格式错误（6-20位，含大写、小写、数字）！");
            return false;
        }

        Console.Write("请确认密码：");
        string confirmPwd = Console.ReadLine();
        if (password != confirmPwd)
        {
            Console.WriteLine("两次密码不一致！");
            return false;
        }

        if (_userDict.ContainsKey(username))
        {
            Console.WriteLine("该用户名已存在！");
            return false;
        }

        _userDict.Add(username, new User(username, password));
        Console.WriteLine("注册成功！");
        return true;
    }

    public bool Login(string username, string password)
    {
        if (!IsNotEmpty(username) || !IsNotEmpty(password))
        {
            Console.WriteLine("用户名或密码不可为空！");
            return false;
        }

        if (_userDict.TryGetValue(username, out User user))
        {
            if (user.Password == password)
            {
                Console.WriteLine("登录成功！模拟进入系统首页...");
                return true;
            }
            else
            {
                Console.WriteLine("密码错误！");
                return false;
            }
        }
        else
        {
            Console.WriteLine("用户名不存在！");
            return false;
        }
    }

    public bool DeleteUser(string username)
    {
        if (_userDict.Remove(username))
        {
            Console.WriteLine("删除成功！");
            return true;
        }
        else
        {
            Console.WriteLine("用户名不存在，删除失败！");
            return false;
        }
    }

    public void ShowAllUsers()
    {
        // foreach循环迭代泛型集合
        foreach (var kvp in _userDict)
        {
            Console.WriteLine($"用户名：{kvp.Key}，密码：{kvp.Value.Password}");
        }
    }
}